
#include <stdatomic.h>

typedef struct __lock_t { 
	// 正如同餐厅叫号，turn表示当前的号码，ticket表示手中的号码
	atomic_int ticket;
	atomic_int turn;
} lock_t;

void init(lock_t *mutex) {
	mutex->ticket = 0;
	mutex->turn = 0;
}

void lock(lock_t *mutex) 
{	
	int my_turn = atomic_fetch_add(&mutex->ticket, 1);
	while (mutex->turn != my_turn)
	; // spin
}
void unlock(lock_t *mutex) 
{	
	// 每一个顾客（线程）用完之后就呼叫下一个号码。
	mutex->turn++;
}

